package cn.ad.server.web.spring.service.actions.handler.gdt;//package cn.ad.server.web.spring.service.actions.handler.gdt;
//
//import java.io.UnsupportedEncodingException;
//import java.math.BigDecimal;
//import java.net.URLEncoder;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//import javax.annotation.Resource;
//
//import org.apache.commons.codec.binary.Base64;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//
//import cn.falconnect.adserver.adapter.AdImpression;
//import cn.falconnect.adserver.adapter.AdNative;
//import cn.falconnect.adserver.adapter.Exchange;
//import cn.falconnect.adserver.adapter.GDTBid;
//import cn.falconnect.adserver.adapter.GDTImpression;
//import cn.falconnect.adserver.adapter.BidContext;
//import cn.ad.server.web.spring.service.actions.handler.adview.ImpressionHandler;
//import cn.ad.server.biz.internal.AdService;
//import cn.ad.server.domain.ad.AdSize;
//import cn.ad.server.domain.ad.AdTemplate;
//import cn.ad.server.domain.ad.Platform;
//import cn.ad.server.domain.ad.PlatformTagSizeMap;
//import cn.ad.server.domain.ad.Strategy;
//import cn.ad.server.domain.enumration.AdFormat;
//
//@Component
//public class GDTImpressionHandler extends ImpressionHandler<GDTBid> {
//
//	// @Value("${bid.adView.ratio}")
//	// private double bidAdViewRatio;
//	static Logger logger = LoggerFactory.getLogger(GDTImpressionHandler.class);
//
//	private static Map<Integer, Boolean> unionMap = new HashMap<Integer, Boolean>();
//
//	static {
//		unionMap.put(79, true);
//		unionMap.put(80, true);
//		unionMap.put(120, true);
//		unionMap.put(207, true);
//		unionMap.put(208, true);
//		unionMap.put(212, true);
//
//		unionMap.put(147, true);
//		unionMap.put(148, true);
//		unionMap.put(149, true);
//		unionMap.put(150, true);
//
//		unionMap.put(58, true);
//		unionMap.put(59, true);
//		unionMap.put(70, true);
//		unionMap.put(113, true);
//		unionMap.put(114, true);
//		unionMap.put(90, true);
//
//		unionMap.put(10, true);
//		unionMap.put(28, true);
//		unionMap.put(31, true);
//		unionMap.put(35, true);
//		unionMap.put(69, true);
//		unionMap.put(71, true);
//		unionMap.put(89, true);
//	}
//
//	@Autowired
//	private AdService adService;
//
//	@Resource
//	private String serverAddress;
//
//	@Override
//	public Exchange getExchange() {
//		return Exchange.GDT;
//	}
//
//	@Override
//	public GDTBid handler(AdImpression impression, BidContext bidContext) {
//		GDTImpression gdtImpression = (GDTImpression) impression;
//
//		Platform platform = adService.fetchPlatformById(Integer.parseInt(Exchange.GDT.getValue()));
//		if (platform == null)
//			return null;
//		Set<Strategy> strategySet = platform.getStrategies();
//		if (strategySet == null)
//			return null;
//
//		AdTemplate adTemplate = null;
//		AdSize size = null;
//		GDTBid bid = null;
//		int adFormatValue = AdFormat.AD_NATIVE.getValue();
//
//		int width = 0;
//		int height = 0;
//
//		List<Integer> creativeSpecs = gdtImpression.getCreative_specs();
//		if (CollectionUtils.isEmpty(creativeSpecs))
//			return null;
//
//		boolean isNative = gdtImpression.getNatives() != null ? true : false;
//		// 原生
//		if (isNative) {
//			for (int spec : creativeSpecs) {
//				adTemplate = adService.fetchTemplateByTagId(String.valueOf(spec));
//				if (adTemplate == null) {
//					// logger.warn("unknow spec id : {}", spec);
//					continue;
//				}
//				bidContext.setAdFormat(adFormatValue);
//				bidContext.setCreativeSpec(spec);
//				bid = strategyFilter(strategySet, bidContext, adTemplate, gdtImpression.getNatives(), width, height,
//						false, 0, 0);
//				if (bid != null) {
//					break;
//				}
//			}
//		} else {
//			for (int spec : creativeSpecs) {
//				PlatformTagSizeMap ptsm = adService.fetchSizeByTagId(String.valueOf(spec));
//				if (ptsm == null)
//					continue;
//				size = ptsm.getAdSize();
//				adFormatValue = ptsm.getAdFormat();
//				width = size.getWidth();
//				height = size.getHeight();
//				bidContext.setAdFormat(adFormatValue);
//				bidContext.setCreativeSpec(spec);
//				bid = strategyFilter(strategySet, bidContext, adTemplate, gdtImpression.getNatives(), width, height,
//						false, 0, 0);
//				if (bid != null)
//					break;
//			}
//		}
//
//		bidContext.setAdspaceWidth(String.valueOf(width));
//		bidContext.setAdspaceHeight(String.valueOf(height));
//		bidContext.setIncludeMimes(gdtImpression.getMultimedia_type_white_list());
//		bidContext.setBidFloor(gdtImpression.getBid_floor());
//		bidContext.setImpId(gdtImpression.getId());
//		return bid;
//	}
//
//	@Override
//	public GDTBid compositeBid(BidContext bidContext, Entry entry) {
//		GDTBid bid = new GDTBid();
//
//		double bidAdViewRatio = adService.getRatio(bidContext.getCampaignId());
//		bid.setBid_price(entry.getPrice().multiply(new BigDecimal(100 * bidAdViewRatio)).intValue());
//		bid.setCreative_id(entry.getAuditId());
//		String impUrl = this.compositeImpUrls(bidContext, entry);
//		String clickUrl = this.compositeClickUrl(bidContext, entry);
//
//		String convertClick = "";
//		String convertImp = "";
//
//		try {
//			// 移动联盟是base64，其他的是urlencode
//			if (ckechMobileUnion(bidContext.getCreativeSpec())) {
//				convertClick = Base64.encodeBase64String(clickUrl.getBytes());
//				convertImp = Base64.encodeBase64String(impUrl.getBytes());
//			} else {
//				convertClick = URLEncoder.encode(clickUrl, "UTF-8");
//				convertImp = URLEncoder.encode(impUrl, "UTF-8");
//			}
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//
//		bid.setClick_param(convertClick);
//		bid.setImpression_param(convertImp);
//
//		return bid;
//	}
//
//	boolean ckechMobileUnion(int spec) {
//		if (unionMap.get(spec) == null)
//			return false;
//		return unionMap.get(spec);
//	}
//
//	@Override
//	public void storeTemplateSpec(Entry entry, AdNative adNative) {
//
//	}
//
//	/**
//	 * 组合印象数据
//	 *
//	 * @param bidContext
//	 * @param entry
//	 * @return
//	 */
//	protected String compositeImpUrls(BidContext bidContext, Entry entry) {
//
//		String impUrlFormat = null;
//		String impUrl = null;
//
//		if (bidContext.getAdxType() == 3) {
//			impUrlFormat = "platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//			impUrl = String.format(impUrlFormat, bidContext.getAdxType(), bidContext.getStrategyId(),
//					bidContext.getCreativeId(), bidContext.getMaterialId(), bidContext.getGuid());
//		} else {
////			impUrlFormat = serverAddress + "imp.html?platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//			impUrlFormat = serverAddress + "v2/imp/ch/3?platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//
//			impUrl = String.format(impUrlFormat, Exchange.GDT.getValue(), bidContext.getStrategyId(),
//					bidContext.getCreativeId(), bidContext.getMaterialId(), bidContext.getGuid())
//					+ "&win_price=%%WIN_PRICE%%";
//		}
//
//		return impUrl;
//
//	}
//
//	/**
//	 * 组合点击数据
//	 *
//	 * @param bidContext
//	 * @return
//	 */
//	protected String compositeClickUrl(BidContext bidContext, Entry entry) {
//
//		String clickUrlFormat = null;
//
//		if (bidContext.getAdxType() == 3) {
//			clickUrlFormat = "platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//			clickUrlFormat = String.format(clickUrlFormat, bidContext.getAdxType(), bidContext.getStrategyId(),
//					bidContext.getCreativeId(), bidContext.getMaterialId(), bidContext.getGuid());
//		} else {
////			clickUrlFormat = serverAddress + "click.html?platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//			clickUrlFormat = serverAddress + "v2/click/ch/3?platform_id=%s&sid=%s&cid=%s&mid=%s&guid=%s";
//			clickUrlFormat = String.format(clickUrlFormat, Exchange.GDT.getValue(), bidContext.getStrategyId(),
//					bidContext.getCreativeId(), bidContext.getMaterialId(), bidContext.getGuid());
//
//			if (StringUtils.hasText(entry.getTargetUrl())) {
//
//				String targetUrl = "";
//				try {
//					targetUrl = URLEncoder.encode(
//							convertTargetUrlHandler.getConvertTarget(bidContext, entry.getTargetUrl()), "UTF-8");
//				} catch (UnsupportedEncodingException e) {
//					e.printStackTrace();
//				}
//				
//				String extendClickUrl = convertTargetUrlHandler.convertExtendClickUrl(bidContext);
//				clickUrlFormat += "&target=" + targetUrl + extendClickUrl;
//
//			}
//
//		}
//		return clickUrlFormat;
//	}
//
//}
